#ifndef CPP_PICKER_VIEW_H
#define CPP_PICKER_VIEW_H

#include <widget/FrameLayout.h>

class Canvas;
class View;
class ImageView;

//@brief 选择器Picker
//@author cvte
//@description 纯文本的Picker，可自定义显示的样式及个数
class PickerView : public FrameLayout {
   public:
    typedef std::vector<std::string> TextVector;

    typedef enum {
        STATUS_CHANGE_ID_VALUE,
        STATUS_CHANGE_ID_COUNT
    } STATUS_CHANGE_ID;

    class PickerValueListener {
       public:
        virtual void onPickerValueChanged(PickerView& picker, int index);
        virtual void onPickerSelectedItemClicked(PickerView& picker, int index); //选中项被点击
    };

    PickerView();
    virtual ~PickerView();

    //增加显示项，同一时间可显示的view，按顺序添加
    void addView(View* view);
    //按顺序增加所有字符串数据
    void addText(const char* text);
    //移除已有全部文本
    void removeAllText();
    //设置移动多少距离时触发item改变
    void setItemChangedMoveGap(int gap);
    //设置滑动时的背景图，由PickerView进行销毁，不可与setUnScrollingImageView设置为同一个对象
    void setScrollingImageView(ImageView* imageView);
    //设置没在滑动时的背景图，由PickerView进行销毁，不可与setScrollingImageView设置为同一个对象
    void setUnScrollingImageView(ImageView* imageView);
    //设置选中项偏移量，即第几个item为选中项，设置0代表第一个item为选中项
    void setSelectedIndexOffset(unsigned int offset);
    //设置选中项改变时的回调
    void setPickerValueListener(PickerValueListener& listener);
    //@method 设置选中项索引
    void setSelection(int index);
    //@method 设置选中项索引，shouldTriggerCallback为true就触发回调和动效，否则不触发回调和动效
    void setSelection(int index, bool shouldTriggerCallback);
    //设置选中项索引不带滑动效果
    void setSelectionNoSettling(int index);
    //获取选中项索引
    unsigned int getSelection();
    //获取数据量
    unsigned int getDataCount();
    //设置选择项是否循环
    void setItemsLoop(bool isLoop);

   private:
    TextVector mItemTexts;
    ImageView* mScrollingImageView = nullptr;     //滑动时的背景图
    ImageView* mUnScrollingImageView = nullptr;   //没在滑动时的背景图
    PickerValueListener* mPickerValueListener = nullptr;
    int mIndexFirst = 0;          //第一个item的索引
    int mIndexFirstAutoSettlingTarget = 0; //自动惯性滑动时目标值（第一个item的索引）
    bool mIsAutoSettling = false; //是否在自动惯性滑动
    int mItemChangedMoveGap = 10;  //移动多少距离时触发item改变
    unsigned int mDataCount = 0; //数据量
    unsigned int mSelectedIndexOffset = 0; //选中项相对mIndexFirst的偏移量，即第几个item为选中项
    bool mIsLoop = false; //是否循环
    bool mSkipClickedOnce = false; //是否跳过一次点击事件处理，用于惯性滑动时点击控件

    void onDraw(Canvas& canvas);
    void onClicked();
    void onTouched(MotionEvent& event);
    void onStatusChanged(int flag, int value);
    void stopSettling();
    //开始自动惯性滑动，即非触摸操作触发的惯性滑动
    void startAutoSettling();
};

#endif